


export interface LoginData {
    userInfo: UserInfo;
    roomId: number; //这个房间号>0 的话 就是已经在游戏中断线重连的
    inviteCode: number; //这个邀请码>0 的话 就是已经创建好房间 之后断线重连的
    roomConfigs: RoomConfig[];
}

export interface RoomConfig {
    id: number;//房间类型 1-普通场 2-私人场
    fees: number[];// 入场费列表
    playerNums: number[];// 玩家人数列表
}

export interface UserInfo {
    userId: string;// 玩家ID
    nickname: string;// 昵称
    avatar: string; // 头像
    coin: number;// 当前金币
    serverTime: number;// 服务器的秒级时间戳

}

//请求匹配
export interface PairRequest {
    playerNum: number;// 玩家人数
    fee: number;// 房间费
}

//创建邀请的请求
export interface CreateInvite {
    playerNum: number;// 玩家人数
    fee: number;// 房间费
}

export interface InviteInfo {
    inviteCode: number;// 邀请码
    playerNum: number;// 玩家人数
    fee: number;// 房间费
    propMode: number;// 0 无道具 1 有道具
    creatorId: string;// 创建者用户ID
    users: InviteUser[];// 匹配到的所有玩家
}

export interface InviteUser {
    userId: string;// 玩家Id
    nickname: string;// 昵称
    avatar: string;// 头像
    ready: boolean;// 是否准备好
    creator: boolean;// 是否邀请的发起者
    onLine: boolean;// 是否在线
}


//接受邀请的请求
export interface AcceptInvite {
    inviteCode: number;// 邀请码
}

// AcceptInvite 接受邀请
export interface AcceptInvite {
    userId: string;// 用户ID
    inviteInfo: InviteInfo;// 邀请信息
}

// InviteReady 邀请者改变准备状态
export interface InviteReady {
    ready: boolean;// true 准备 false 取消准备
}

// NoticeUserInviteStatus 广播玩家的邀请状态˝
export interface NoticeUserInviteStatus {
    userId: string;// 玩家Id
    ready: boolean;// 是否准备好
    onLine: boolean;// 是否在线
}

// ChangeInviteCfg 更改邀请配置
export interface ChangeInviteCfgRequest {
    inviteCode: number;// 邀请码
    fee: number;// 房间费
}

export interface ChangeInviteCfgResult {
    fee: number;// 房间费
}

// NoticeLeaveInvite 邀请广播有人离开
export interface NoticeLeaveInvite {
    userId: string;// 玩家Id
    isCreator: boolean;// 离开者是否是创建者
}

//创建者踢出玩家请求
export interface InviteKickOut {
    userId: string // 被踢除的玩家Id
}

//通知邀请状态
export interface NoticeUserInviteStatus {
    userId: string  //用户 id
    ready: boolean //准备状态
    onLine: boolean //是否在线
}


//////////////////////////////////////////游戏内的数据//////////////////////////////////////////

//开始游戏和 重连都走这一个
export interface NoticeStartGame {

    roomId: number;// 房间ID
    roomType: number; // 房间类型  EnumBean.RoomType
    playerNum: number;// 玩家人数
    fee: number; // 房间费
    propMode: number;// 道具模式
    specialFull: number;// 多少特殊块填满技能槽
    specialRemoved: number;// 已移除特殊块数量
    users: RoomUser[];// 匹配到的所有玩家
    gameStatus: number;// 游戏状态  EnumBean.GameStatus
    countDown: number;// 游戏状态倒计时
    blockList: Block[];// 地图
    opIndex: number;// 操作索引
    lookPos: number;// 旁观座位号
    curTask: CurTask// 当前任务
    mapType: number;// 地图类型（火山==1，冰川==2）
}

export interface RoomUser {
    userId: string;// 用户ID
    nickName: string;// 昵称
    avatar: string;// 头像
    pos: number;// 座位号
    coin: number;// 玩家最新金币
    status: number;// 玩家状态   EnumBean.UserStatus
    score: number;// 消除分数
    rank: number //当前排名
    playerNumber: number;// 玩家初始号码，1为左上角，2为右上角，3左下角，4右下角
    x: number;// 玩家初始位置x坐标
    y: number;// 玩家初始位置y坐标
    playerType: string;// 玩家操作动物类型 red，yellow，green，pink
    surviveTime: number;// 玩家存活时间(毫秒)
    bpStatus?: number;// 砖块派对状态
}


// // 砖块派对游戏相关接口
// // GameStart 砖块派对游戏开始消息
// export interface GameStartData {
//     roomId: number;// 房间ID
//     roomType: number; // 房间类型 1-普通场 2-私人场
//     playerNum: number;// 玩家人数
//     mapType: number;// 地图类型（火山==1，冰川==2）
//     fee: number; // 房间费
//     playerData: PlayerData[];// 匹配到的所有玩家
//     gameStatus: number;// 游戏状态
//     countDown: number;// 倒计时(毫秒)
// }

// // PlayerData 砖块派对游戏中的玩家数据
// export interface PlayerData {
//     userId: string;// 玩家ID
//     playerNumber: number;// 玩家初始号码，1为左上角，2为右上角，3左下角，4右下角
//     x: number;// 玩家初始位置x坐标
//     y: number;// 玩家初始位置y坐标
//     playerType: string;// 玩家操作动物类型 red，yellow，green，pink
//     surviveTime: number;// 玩家存活时间(毫秒)
//     rank: number;// 玩家排名
    
//     // 砖块派对游戏额外字段
//     nickName?: string;// 玩家昵称
//     avatar?: string;// 玩家头像
//     coin?: number;// 玩家金币
//     bpStatus?: number;// 砖块派对状态
// }

export interface Block {
    id: number; // 块的ID
    color: number; // 块颜色 EnumBean.BlockColor  1-红色 2-蓝色 3-绿色 4-黄色 5-紫色
    type: number; // 块类型 EnumBean.BlockType 1-普通块 2-箭头X 3-箭头Y 4-炸弹 5-彩虹 6-超级箭头 7-炸弹箭头 8-彩虹箭头 9-超级炸弹 10-彩虹炸弹 11-超级彩虹
    obstacle: Obstacle; // 障碍物  
}

export interface Obstacle {
    type: number; //EnumBean.Obstacle
    fromUid: string //如果 type==1002 的话会有两个用户 id 用，隔开，前面的id是发射锁链的用户后面的id是发射冰块的用户

}
// ObstacleBlock 障碍物的块
export interface ObstacleBlock {
    id: number; // 旧的块ID(未掉落前的位置)
    obstacle: Obstacle // 障碍物 （这里代表消除障碍物之后 剩下的状态）
}


export interface CurTask {
    id: number;// 任务ID
    color: number;// 目标颜色
    require: number;// 需要完成的数量
    current: number;// 当前进度
    reward: number;// 奖励(1-彩虹、2-冰块、3-锁链、4-箭头X、5-箭头Y)
}


//移动块-MoveBlock 的请求数据   
export interface MoveBlock {
    id: number;// 块ID
    otherId: number;// 另一个块ID
}

// NoticeScoreChg 通知分数变化(消息ID-ScoreChg)
export interface NoticeScoreChg {
    userId: string;// 玩家Id
    score: number;// 新的分数
    taskObstacle: ObstacleBlock // 障碍物

}
// MoveBlockFail 移动块失败
export interface MoveBlockFail {
    id: number;// 块ID
    otherId: number;// 另一个块ID
}

// NoticeMoveBlock 通知移动块
export interface NoticeMoveBlock {
    userId: string;// 玩家Id
    id: number;// 块ID
    otherId: number;// 另一个块ID
    score: number;// 新的分数
    specialRemoved: number;// 新的已移除特殊块数量
    groups: MoveGroup[];// 匹配分组的列表
    activate: Activate;// 激活特殊道具
    opIndex: number;// 操作索引
    isTaskOver: boolean// // 是否旧任务结束
    taskReward: TaskReward// // 任务奖励
    curTask: CurTask// 当前任务
    obstacles:ObstacleBlock[] // 障碍物 (在这里没啥用  就是用来打印数据的)
}

// TaskReward 任务奖励
export interface TaskReward {
    id: number;// 块ID
    type: number;// 块类型 EnumBean.BlockType

}

// NoticeActivate 通知激活特殊道具
export interface Activate {
    times: number  // 激活次数
    rectIDs:number[] //激活区域四个块 中左上角的块
    groups: MoveGroup[] // 匹配分组的列表
}

// MoveGroup 匹配分组
export interface MoveGroup {
    matches: Match[];// 匹配列表
    drops: DropBlock[];// 新掉落的块列表
    scoreChg: number;// 分数变化
    obstaclesChg:ObstacleBlock[] //
}

export interface DropBlock {
    id: number; // 块的ID
    color: number; // 块颜色 EnumBean.BlockColor  1-红色 2-蓝色 3-绿色 4-黄色 5-紫色
}

export interface UserSettlement {
    userId: string;// 玩家Id
    coinChg: number;// 金币变化
    coin: number;// 玩家最新金币
    rank: number;// 排名
    score: number;// 分数
    surviveTime: number;// 存活时间（毫秒）
}

// Match 单个匹配
export interface Match {
    removes: Remove[];// 移动后可消除的块列表(也可能两个特殊块叠一起，不会构成>=3的同颜色消除)
    merge: MergeBean;// 合成块
    passives: Passive[];// 被动消除列表(Removes中有N个特殊块)
}

export interface MergeBean{
    id: number;// 块ID
    type:null;// 块类型 EnumBean.BlockType
}

// Passive 被动消除
export interface Passive {
    id: number;// 块ID
    type: number;// 块类型 EnumBean.BlockType
    score: number;// 得分
    obstacle: number;// 障碍物
    removes: Remove[];// 消除的块列表
    passives: Passive[];// 被动消除列表(Removes中有N个特殊块)
}

// PassiveRemove 被动消除移除的块
export interface Remove {
    id: number;// 块ID
    score: number;// 得分
}

export interface NoticeSettlement {
    users: UserSettlement[];// 闲家结算列表
}

//玩家主动离开房间的请求数据
export interface LeaveRoom {
    isConfirmLeave: boolean;// 确认离开房间
}

//玩家主动离开房间-LeaveRoom
export interface NoticeLeaveRoom {
    userId: string;// 玩家Id
}

//玩家被踢出房间-KickOutUser
export interface NoticeUserKickOut {
    userId: string;// 玩家Id
}

export interface IllegalOperation {
    id: number; //移动块
    otherId: number; //被交换块
    tokenUserId: string; //当前操作用户的id，不是此次操作用户的 id
}


// 帧同步相关接口
// FrameInput 玩家输入帧数据 - 修改为50ms内发送多个帧
export interface FrameInputData {
    clientInputs: ClientInputFrame[]; // 摇杆输入数组，包含多个输入数据
}

// 单个客户端输入帧
export interface ClientInputFrame {
    frameId: number; // 客户端帧ID
    x: number; // 摇杆X坐标 (-1.0 到 1.0)
    y: number; // 摇杆Y坐标 (-1.0 到 1.0)
}

// 单个帧输入数据（内部使用）
export interface GameInputFrame {
    frameId: number; // 客户端帧ID
    x: number; // 摇杆X轴 [-1, 1]
    y: number; // 摇杆Y轴 [-1, 1]
    dt: number; // 固定帧间隔时间 0.01 (100FPS)
}

// PlayerPositions 玩家位置信息
export interface PlayerPositions {
    userId: string; // 玩家ID
    positions: PositionData[]; // 玩家位置数组，包含多个位置数据
}

// PositionData 位置数据结构
export interface PositionData {
    clientFrameId: number; // 客户端帧号
    x: number; // X坐标（像素）
    y: number; // Y坐标（像素）
}

// GameFrame 服务器广播的游戏帧数据 - 修改为批量接收格式
export interface GameFrameData {
    serverFrameId: number; // 权威帧ID
    serverTime: number; // 服务器时间戳（毫秒）
    gameEvents: GameEventData[]; // 该帧发生的所有游戏事件
    playerPositions: PlayerPositions[]; // 玩家实际位置信息
}

// PlayerInputData 单个玩家的输入数据 - 修改为批量格式
export interface PlayerInputData {
    userId: string; // 玩家ID
    frames: PlayerFrameInput[]; // 该玩家在50ms内的所有帧输入数据
}

// 玩家单帧输入数据
export interface PlayerFrameInput {
    clientFrameID: number; // 客户端帧ID
    inputX: number; // 验证后的X轴输入 [-1, 1]
    inputY: number; // 验证后的Y轴输入 [-1, 1]
}

// 帧同步状态管理
export interface FrameState {
    frameId: number; // 帧ID
    serverTime: number; // 服务器时间戳
    playerStates: PlayerFrameState[]; // 所有玩家的状态
}

// 单个玩家的帧状态
export interface PlayerFrameState {
    userId: string; // 玩家ID
    position: cc.Vec2; // 玩家位置
    velocity: cc.Vec2; // 玩家速度
    rotation: number; // 玩家朝向
    isActive: boolean; // 是否活跃
}

// 预测回滚相关接口
export interface PredictionState {
    frameId: number; // 预测帧ID
    predictedStates: PlayerFrameState[]; // 预测的玩家状态
    confirmed: boolean; // 是否已确认
}

// 砖块派对方块相关接口
// BrickPartyBlock 方块数据
export interface BrickPartyBlock {
    id: number; // 方块ID
    x: number; // 方块X坐标 (0-8)
    y: number; // 方块Y坐标 (0-8)
    blockType: number; // 方块类型
    animationState: string; // 动画状态: "none", "dou", "out", "in"
    animationDelay: number; // 动画延迟时间(毫秒)
}

// GameEventData 游戏事件数据 (统一数字事件系统)
export interface GameEventData {
    eventType: number; // 事件类型 (1-10)
    currentRound: number; // 当前回合数
    countDown: number; // 倒计时(毫秒)
    randomSeed: number; // 随机种子(用于客户端动画效果)
    message: string; // 阶段消息
    blocks?: BrickPartyBlock[]; // 方块列表 (类型3-5)
    winners?: string[]; // 获胜者列表 (类型6)
    userId?: string; // 用户ID (类型7-10)
    pixelX?: number; // X坐标 (类型7)
    pixelY?: number; // Y坐标 (类型7)
    deathReason?: string; // 死亡原因 (类型7)
    surviveTime?: number; // 存活时间 (类型7)
    isAlive?: boolean; // 玩家是否存活 (类型10使用，true=存活，false=死亡)
    syncData?: { [key: string]: any }; // 同步数据 (类型10)
}



// 方块动画状态枚举
export enum BlockAnimationState {
    NONE = "none", // 默认状态
    SHAKE = "dou", // 抖动动画 (2s)
    FALL = "out", // 下落动画 (0.5s)
    RISE = "in" // 上升动画 (0.5s)
}

// 游戏事件类型常量
export enum GameEventType {
    WAITING = 1, // 等待阶段 - 游戏开始倒计时
    ROUND_WAITING = 2, // 回合等待 - 补齐后等待下一回合
    SHAKING = 3, // 松动阶段 - 方块开始松动
    FALLING = 4, // 掉落阶段 - 方块开始掉落
    RESTORING = 5, // 补齐阶段 - 方块补齐
    ENDING = 6, // 结束阶段 - 游戏结束
    PLAYER_DEATH = 7, // 玩家死亡 - 玩家掉落死亡
    PLAYER_DISCONNECT = 8, // 玩家断线 - 网络连接断开
    PLAYER_LEAVE = 9, // 离开游戏 - 主动退出游戏
    PLAYER_RECONNECT = 10 // 断线重连 - 重新连接游戏
}

// 游戏阶段常量 (对应newPhase字段)
export enum GamePhase {
    WAITING = 1, // 等待阶段
    SHAKING = 2, // 松动阶段
    FALLING = 3, // 掉落阶段
    RESTORING = 4, // 补齐阶段
    ROUND_WAITING = 5, // 回合等待
    ENDING = 6 // 结束阶段
}









